package com.kang.c0c.tree.node;

import com.kang.c0c.optimize.Address;


/**
 * 双目运算符节点，定义了抽象语法树中所有双目运算符的节点
 * +、-、×、/、=、>、<、>=、<=、!=、==
 * 其中打印printf，while整体上看也是对两个节点进行操作的，就某种程度的意义上也可以算作
 * 为双目运算,但是为了抽象语法树的可读性更强，放弃将其加入此类节点中
 * 
 * 所以有：
 * +		：PLU	加法
 * -		：SUB	减法
 * ×		：MUL	乘法
 * /		：DIV	除法
 * =		：EVA	赋值
 * >		：GT		大于
 * <		：LT		小于
 * >=		：GEQ	大于等于
 * <=		：LEQ	小于等于
 * !=		：NEQ	不等于
 * ==		：EQ		等于
 * 
 * 在语法分析生成抽象语法树时处理表达式、项、因子的返回节点不同引起的程序设计问题时引入一种特殊的二叉树节点
 * 一元		：UARY	一元的二叉树，它的左子树有效，右子树无效
 *
 * @field
 * left		：左操作子节点
 * right	：右操作子节点
 * 
 * @author kang
 *
 * Feb 6, 2009
 */
public class BinaryNode extends Node{
	private Node left;
	private Node right;
	
	public BinaryNode(){
		super();
	}
	
	public BinaryNode(int node){
		this(node,null,null);
	}
	
	public BinaryNode(int node,Node left,Node right){
		super(node);
		this.left = left;
		this.right = right;
		this.addr = null;
	}

	public Node getLeft() {
		return left;
	}

	public void setLeft(Node left) {
		this.left = left;
	}

	public Node getRight() {
		return right;
	}

	public void setRight(Node right) {
		this.right = right;
	}
	
	public boolean equal(BinaryNode node){
		if(node == null)
			return false;
		
		if(this.getNode() != node.getNode())
			return false;
		
		switch(this.getNode()){
		case Nodes.EQU:
		case Nodes.PLU:
		case Nodes.MUL:
		case Nodes.NEQ:
			return (left.equals(node.left)&&right.equals(node.right))||(left.equals(node.right)&&right.equals(node.left));
		case Nodes.SUB:
		case Nodes.DIV:
		case Nodes.GT:
		case Nodes.GEQ:
		case Nodes.LT:
		case Nodes.LEQ:
			return left.equals(node.left)&&right.equals(node.right);
		default:
			if(right == null){
				if(node.getRight() != null)
					return false;
				return left.equals(node.left);
			}
			return left.equals(node.left)&&right.equals(node.right);
		}		
	}
	
	public Address addr;
}